CuteMouse driver v2.0. Copyright (c) 1997-2002 Nagy Daniel
Release date: 2002/10/01


License:
--------

CuteMouse is released under the terms of the GNU General Public License
(GPL). For further information please read the file COPYING.


Description:
------------

CuteMouse is a mouse driver which supports many protocols of serial and
PS/2 mice. It can search for a serial mouse at all COM ports or only at
a specified port.

CuteMouse supports a new Wheel API. This means that you can write your
applications which use the mouse wheel. For programming details see
WHEELAPI.TXT.

An important CuteMouse feature is its small memory footprint: the resident
part (TSR) occupies less than 3.5K. CuteMouse can also install itself in
upper memory, when available, without requiring external utilities such
as the DOS 'lh' (loadhigh) command.

CuteMouse supports cursor drawing in all standard graphics and text modes
with any screen size. These are automatically detected whenever the video
mode or the screen size is changed or reset functions are called.

You can subscribe to the CuteMouse discussion group at the official
homepage http://cutemouse.sourceforge.net or by sending an empty
email to <cutemouse-subscribe@yahoogroups.com>.

CuteMouse is part of the FreeDOS project at http://www.freedos.org


Details:
--------

CTMOUSE supports standard Mouse Systems, Microsoft and Logitech serial
and PS/2 protocols. Also supported are mice with wheel. By default, when
searching for a connected mouse, the PS/2 port is checked first, then all
COM ports are scanned.

Option /S, whose syntax is described in the help screen, disables PS/2
support and can specify the COM port to be checked for a mouse connection
and its IRQ line; option /P disables serial protocols. If option /S is
present in the command line, but PS/2 support is also required, then
option /P must also be present.

If a COM port number is not specified with the /S option, then CTMOUSE
searches all COM ports. If an IRQ line is not specified with the /S
option, then the default IRQ line value is IRQ4 for COM1/3 and IRQ3
for COM2/4. In the future IRQ autodetection will be added.

Option /V reverses default search order, causing CTMOUSE to look for a
serial mouse before checking for the PS/2 device. This can be useful, for
example, on notebooks which have a built-in PS/2 pointing device to enable
use of a serial mouse, when attached. Using option /Y (see below) may also
be required along with /V. Note: option /V enables both serial and PS/2
protocols, so using options /P and /S without arguments along with /V
in the command line is meaningless.

For serial mice, CTMOUSE searches all COM ports (or at the port specified
by option /S) for an attached mouse with Microsoft or Logitech protocol.
If no such mouse is found then CTMOUSE installs at the first existing
(or specified) COM port in Mouse Systems mode, whether a mouse is there
or not. (This is because the Mouse Systems protocol defines no detection
sequence). Option /Y in the command line disables Mouse Systems protocol
support and prevents driver installation if no mouse with Microsoft or
Logitech protocol is found. Note: option /Y forces serial mouse search,
but, unlike option /S, doesn't disable PS/2 support.

Both PS/2 and plain Microsoft protocols assume a two button mouse but
option /3 in the command line can be used to enable the middle button
if one is present.

WARNING: when the middle button of a plain Microsoft mouse is enabled,
pressing left or right button along with the middle button can cause
"middle button state triggering" - i.e. when the middle button is pressed
the driver thinks it is released and vice-versa. This is a peculiarity of
the Microsoft protocol and can't be changed. If button triggering occurs
simply press the left or right button along with the middle button once
again to clear the problem.

Option /R, whose syntax is described in the help screen, allows the
preferred sensitivity to be specified for each axis of mouse movements.
These define the relationship between cursor and mouse movement - the
higher the sensitivity, the further the cursor moves for a given mouse
movement. For sensitivity 0 coefficient 1/3 is used, for sensitivity 9
coefficient 3.0 is used.

If installing from low memory, CTMOUSE attempts to move itself into upper
memory (UMB) if there is a suitable free UMB block and option /W is not
used. With option /W any external utility can be used to install CTMOUSE
at a specific location. Subsequent CTMOUSE runs simply reset the resident
part to the new command line options, unless the mouse is not found or
option /B or /N is used.

When installing, CTMOUSE ignores and hides any present mouse services
unless option /B is used. Option /U in command line can be used to
unload the resident part of CTMOUSE unless driver interrupts have been
intercepted by another program. After successful unloading, CTMOUSE
restores mouse services that were present at installation time.

Option /B in the command line cancels CTMOUSE execution if any (including
CTMOUSE itself) mouse services are already present. With option /B CTMOUSE
will not install itself above loaded mouse drivers and will not reset the
resident part to new command line options.

In contrast, option /N forces the loading of a new TSR even if CTMOUSE is
already loaded - without this option CTMOUSE will only reset the loaded
resident part. In cases where mouse services are provided by any other
driver or are not present at all, CTMOUSE loads a new TSR even without
option /N - see table below:

options		no services	other driver	CTMOUSE loaded
-------		-----------	------------	--------------
/B		load CTMOUSE	do nothing	do nothing
<default>	load CTMOUSE	load CTMOUSE	update resident part
/N		load CTMOUSE	load CTMOUSE	load new CTMOUSE

Option /N is useful for batch files, which load CTMOUSE before some
actions and unload it after.

For each event CTMOUSE returns an appropriate exit code which can be used
in "if errorlevel" statements in batch files:

	0  PS/2, Microsoft or Logitech mouse found and CTMOUSE installed;
	   Unload successful;
	   /? option used.
	1  CTMOUSE installed in Mouse Systems mode;
	   Unload failed because CTMOUSE was not loaded.
	2  Resident part switched to PS/2, Microsoft or Logitech mode;
	   Unload failed because driver interrupts were intercepted.
	3  Resident part switched to Mouse Systems mode.
	4  Mouse services already present (returned for option /B only).
	5  Mouse not found;
	   Invalid option used.

Together with options /B and /N, this enables creation of complex and
intelligent batch files. For example, the following batch file can be
used to run a program that requires mouse services to be present:

	ctmouse/n/y>nul
	if errorlevel 5 echo Mouse not found!
	if errorlevel 5 goto end
	<program> %1 %2 %3 %4 %5 %6 %7 %8 %9
	ctmouse/u>nul
	:end

In the previous example, CTMOUSE is loaded before <program> and unloaded
afterwards regardless of whether or not mouse services are already present
(e.g., another mouse driver was loaded). This may not be suitable if every
free byte of memory is important or if CTMOUSE does not support a mouse
that is currently in use. In the following example, CTMOUSE will be
loaded and unloaded only if no mouse services are present:

	if "%1"=="@" goto driverloaded
	ctmouse/b/y>nul
	if errorlevel 5 echo Mouse not found!
	if errorlevel 5 goto end
	if errorlevel 2 goto run

	call %0 @ %1 %2 %3 %4 %5 %6 %7 %8 %9
	ctmouse/u>nul
	goto end

	:driverloaded
	shift
	:run
	<program> %1 %2 %3 %4 %5 %6 %7 %8 %9
	:end

Option /B can also be used to manually specify a mouse search sequence.
In the following example, CTMOUSE is installed by the first command that
finds a mouse and the following commands won't affect the resident part:

	ctmouse/b/s4/y>nul
	ctmouse/b/p/y>nul
	ctmouse/b/s2/y>nul

Use the /? command line option to obtain a help screen with all option
descriptions.

The CuteMouse package also includes a utility to detect COM ports
(COMTEST) and a serial protocol analyzer (PROTOCOL). PROTOCOL shows how
mice work and what they send to the computer for each action. PROTOCOL can
even decipher information sent by PnP mice. All output goes through DOS
functions and can be redirected to a file for subsequent analysis or
sending to someone else.


Compiling:
----------

To assemble the English version of the driver use TASM (or any compatible
assembler) and any linker that can produce a COM file from OBJ files:

	copy ctm-en.msg ctmouse.msg
	tasm /m @asmlib.cfg ctmouse.asm
	tlink /t /x ctmouse.obj,ctmouse.exe
	com2exe -s512 ctmouse.exe ctmouse.exe

To assemble the serial protocol analyzer:

	tasm /m @..\asmlib.cfg protocol.asm
	tlink /t /x protocol.obj

To compile or delete temporary files, the MAKE utility also can be used
(see makefile).


Known problems:
---------------

Symptom: if the mouse is moved when Works 2.0 for DOS or Word 5.5 for DOS
	are redrawing a screen in graphics mode then some parts of screen
	are corrupted.
Cause: these programs don't hide the mouse cursor while drawing on the
	screen and/or don't use the EGA RIL API when changing video
	adapter registers.
Solution: correct the code of these programs; don't move the mouse while
	the screen is being redrawn; future versions of CTMOUSE will
	probably read the VGA adapter registers directly.

Symptom: under Windows 3.1 after a mouse reset (INT 33/0000), the graphics
	mouse cursor is shifted by one pixel right/down.
Cause: Windows traps INT 33 calls and for the reset function additionally
	calls the text and graphics cursor define functions with [-1,-1]
	hot spot.
Solution: use 'PUSHF/CALL FAR' sequence instead of 'INT' instruction to
	call INT 33 handler; there probably are some Windows APIs, which
	can be used in CTMOUSE to interact with Windows directly.

Symptom: sometimes, under Windows 3.1, the graphics cursor has a black box
	shape. This may also happen after switching between windows.
Cause: probably due to a Windows bug when Windows incorrectly redefines
	the cursor after video mode changes or switching between windows.
Solution: restart the graphics application or switch back and forth
	between windows again; there probably are some Windows APIs,
	which can be used in CTMOUSE to interact with Windows directly.

Symptom: unlike Microsoft Mouse driver 8.2, the mouse doesn't work in
	a windowed DOS box of Windows 3.1 with CTMOUSE installed.
Cause: the Microsoft Mouse driver most probably uses an unpublished API to
	interact with Windows.
Solution: currently unknown.

Symptom: CTMOUSE fails to detect PS/2 mice under Windows 9x/ME.
Cause: Windows seems unwilling to let a DOS application have access to the
	PS/2 device services.
Solution: currently unknown.


Credits:
--------

(Some names are mentioned in HISTORY).

Ralf Brown <ralf@pobox.com>: author of Interrupt List (a great collection
  of system specific information).
Joergen Ibsen / Jibz <jibz@hotmail.com>: author of aPACK (an excellent
  executable packing program); advice about managing executables.

Arkady V.Belousov <ark@mos.ru>: bugfixes, optimizations and features.
Matthias Paul <Matthias.Paul@post.rwth-aachen.de>: many ideas and
  advice about interfacing with OS.
Jason Burgon <jason@jayman.demon.co.uk>: bugfixes, features, advice
  about interrupts handling consistency.
NetDave <david@prog.cz>: wheel support idea.
Alain Mouette <alainm@pobox.com>: many ideas and message files.
Robert Riebisch <riebisch@bercom-berlin.de>: mode 13h bugfix.
Fernando Papa Budzyn: automatic loadhigh capability.
Martin <nocash@work.de>: optimizations.
Paul Schubert: much faster PS/2 code.
All who helped with ideas and code.


Contacts:
---------

mailto:nagyd@users.sourceforge.net
http://cutemouse.sourceforge.net
